package com.dx.chat.pusher.utils;

import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.utils.SimpleReferenceCache;

/**
 * dubbo 指定ip调用
 */
public class DubboUtils {

    /**
     * 通过服务提供者ip获取dubbo 服务，不通过zookeeper
     * className provider 的class
     * ip provider
     * port provider
     */
    public static <T> T getDubboService(Class<?> className, String ip,Integer port) {
        String appName = YmlConfigUtil.getConfigByKey("dubbo.application.name");
        return getDubboService(className, String.format("dubbo://%s:%s", ip, port), appName, port);

    }


    /**
     * 通过服务提供者ip获取dubbo 服务，不通过zookeeper
     * * className provider 的class
     *      * ip provider
     *      * port provider
     *      appName  是dubbo 消费方的应用名
     */
    public static <T> T getDubboService(Class<?> className, String dubboUrl, String appName,Integer port) {
        //消费者应用名
        ApplicationConfig application = new ApplicationConfig();
        application.setName(appName);

        //获取服务
        ReferenceConfig<T> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(application);
        referenceConfig.setInterface(className);
        referenceConfig.setUrl(dubboUrl);
        //超时时间10s
        referenceConfig.setTimeout(10 * 1000);
        //仅仅调用一次
        referenceConfig.setRetries(0);
        //缓存规则 服务分组/服务接口:版本号。这里用端口号区分两个版本
        //referenceConfig.setVersion(String.valueOf(port));
        //看自己应用配置中配置
//        String dubboVersion = YmlConfigUtil.getConfigByKey("dubbo.service.version");
//        if(!StringUtils.isEmpty(dubboVersion)){
//            referenceConfig.setVersion(dubboVersion);
//        }
        //一般服务消费者和提供者 是一样的，但服务消费者上面不一定配置了 这里直接用dubbo 消费者分组来替代
        String dubboGroup = YmlConfigUtil.getConfigByKey("dubbo.consumer.group");
        if(!StringUtils.isEmpty(dubboGroup)){
            referenceConfig.setGroup(dubboGroup);
        }

        SimpleReferenceCache cache = SimpleReferenceCache.getCache();
        //todo 去掉缓存。缓存key规则有点问题.不加缓存又比较慢。研究一下
        cache.destroyAll();
        return cache.get(referenceConfig);

    }
}
